using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.Xml;
using System.IO;
using System.Diagnostics;
using System.Reflection;
namespace IHC_InspectorExpress.Modelo
{
    [Serializable]
    public class Usuario
    {
        private String nombreUsuario;
        private String emailUsuario;
        private String sexoUsuario;
        private String directorio_por_defecto;

        public Usuario()
        {
            this.nombreUsuario = "";
            this.emailUsuario = "";
            this.sexoUsuario = "";
        }

        public Usuario(String nombre, String email, String sexo)
        {
            this.nombreUsuario = nombre;
            this.emailUsuario = email;
            this.sexoUsuario = sexo;
        }

        public String NombreUsuario
        {
            get { return nombreUsuario; }
            set { nombreUsuario = value; }
        }

        public String EmailUsuario
        {
            get { return emailUsuario; }
            set { emailUsuario = value; }
        }

        public String SexoUsuario
        {
            get { return sexoUsuario; }
            set { sexoUsuario = value; }
        }

        override public String ToString()
        {
            return String.Format("[Usuario: nombre = {0}, email = \"{1}\", sexo = ${2}]",
                                    this.nombreUsuario, this.emailUsuario, this.sexoUsuario);
        }


        /// <summary>
        /// Obtiene una lista con los usuarios
        /// </summary>
        /// <returns>una lista con los usuarios</returns>
        public ListaUsuario obtenerUsuarios(String directorio)
        {
            try
            {
                this.directorio_por_defecto = directorio;
                String filename = directorio_por_defecto+"/Datos/Usuarios.xml";
                StreamReader myStream = new StreamReader(filename);
                ListaUsuario usuarios = new ListaUsuario();
                if (myStream != null)
                {
                    XmlTextReader xr = new XmlTextReader(myStream);
                    XmlSerializer xs = new XmlSerializer(typeof(ListaUsuario));

                    Object c;

                    if (xs.CanDeserialize(xr))
                    {
                        // Deserializar los datos de entrada
                        c = xs.Deserialize(xr);

                        // obtener la definicion del objeto
                        Type t = typeof(ListaUsuario);

                        // Obtener un array con los atributos recuperados
                        PropertyInfo[] properties = t.GetProperties();

                        // Recorrer los atributos, y asignarlos a la estructura de Heuristica
                        foreach (PropertyInfo p in properties)
                        {
                            p.SetValue(usuarios, p.GetValue(c, null), null);
                        }
                    }

                    //Se cierra el stream y el lector
                    xr.Close();
                    myStream.Close();
                }
                return usuarios;
            }
            catch (Exception ex)
            {
                return null;
            }
        }


        /// <summary>
        /// Guarda la lista de tareas. Actualiza el archivo si es que hay nuevos
        /// </summary>
        /// <param name="tareas">lista de tareas</param>
        /// <returns>un booleano indicando si hay error o no en la operacion</returns>
        public bool guardarUsuarios(ListaUsuario usuarios)
        {
            try
            {
                Stream myStream;
                string filename = directorio_por_defecto + "/Datos/Usuarios.xml";
                myStream = File.OpenWrite(filename); //Se abre un archivo para guardar la estructura
                if (myStream != null)
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(ListaUsuario));
                    formatter.Serialize(myStream, usuarios); //Se guarda en el archivo 
                    myStream.Close(); //Se cierra el stream           
                    Debug.WriteLine("ha sido ingresado el usuario");
                }
                return true;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("No se ha podido ingresar al sistema");
                return false;
            }
        }

        /// <summary>
        /// DTOUsuario:
        /// Almacena los datos de un usuario en particular. 
        /// Nombre , e_mail y sexo
        /// </summary>
        //[XmlIgnore]
        public class DTOUsuario
        {
            private string nombreUsuario;
            private string sexoUsuario;
            private string emailUsuario;

            public string NombreUsuario
            {
                get { return nombreUsuario; }
                set { nombreUsuario = value; }
            }

            public string EmailUsuario
            {
                get { return emailUsuario; }
                set { emailUsuario = value; }
            }

            public string SexoUsuario
            {
                get { return sexoUsuario; }
                set { sexoUsuario = value; }
            }
        }

        /// <summary>
        /// agregarUsuario:
        /// Agrega un nuevo usuario a IE
        /// Recibe: un DTOUsuario
        /// Retorna: int - Codigo de resultado de la operacion:
        ///     0   correcto
        ///     1   El nombre del sistema ya existe
        ///     -1  Error desconocido
        /// </summary>
        //[XmlIgnore]
        public int agregarUsuario(DTOUsuario dto_usuario,String directorio)
        {
            int resultado = 0;
            try
            {
                directorio_por_defecto = directorio;
                //obtengo la lista de usuarios
                ListaUsuario usuarios = obtenerUsuarios(directorio_por_defecto);
              //  ListaTarea tareas = obtenerTareas();
                //reviso si no existe el nuevo sistema a agregar ya en la aplicacion
                bool existe_usuario = false;
                foreach (Usuario usuario in usuarios.Usuarios)
                {
                    //compara ambos
                    if ((usuario.NombreUsuario.CompareTo(dto_usuario.NombreUsuario) == 0)
                        && (usuario.NombreUsuario.CompareTo(dto_usuario.EmailUsuario) == 0))
                    {
                        existe_usuario = true;
                        resultado = 1;
                    }
                }
                if (!existe_usuario)
                {
                    if (usuarios != null)
                    {
                        //agrego nombre a la lista
                        usuarios.Usuarios.Add(new Usuario(dto_usuario.NombreUsuario, dto_usuario.EmailUsuario,
                            dto_usuario.SexoUsuario   ));
                        //guardo la nueva lista de sistemas*/
                        bool exito = guardarUsuarios(usuarios);
                        if (!exito) resultado = -1;
                        //guardo la nueva lista de usuarios
                       /* exito = guardarTareas(usuarios);*/
                        if (!exito)
                        {
                            resultado = -1;
                            Debug.WriteLine("ASDASDASDASDASDASDASDASDASDA");
                        }
                        else resultado = 0;
                    }
                    else
                    {
                        resultado = -1;
                    }
                }

            }
            catch (Exception ex)
            {
                resultado = -1;
            }
            return resultado;
        }



    }
}
